defmodule EliPhxPlay.Repo.Migrations.CreateGroupMembers do
  use Ecto.Migration

  def change do
    # 创建群聊成员表，管理群聊中的成员信息
    create table(:group_members, primary_key: false) do
      # 成员记录唯一标识符
      add :member_id, :binary_id, primary_key: true, comment: "成员记录唯一标识符"

      # 所属群聊ID，外键关联groups表，级联删除
      add :group_id, references(:groups, column: :group_id, type: :binary_id, on_delete: :delete_all),
          comment: "所属群聊ID"

      # 用户ID，外键关联users表，级联删除
      add :user_id, references(:users, column: :user_id, type: :binary_id, on_delete: :delete_all),
          comment: "用户ID"

      # 群内角色：owner(群主)、admin(管理员)、member(普通成员)
      add :role, :string, null: false, default: "member",
          comment: "群内角色: owner/admin/member"

      # 用户在该群聊中的昵称，可选
      add :group_nickname, :string, comment: "群内昵称"

      # 是否被禁言，默认false
      add :is_muted, :boolean, default: false, comment: "是否被禁言"

      # 禁言到期时间，可选
      add :mute_until, :naive_datetime, comment: "禁言到期时间"

      # 自动添加创建时间和更新时间
      timestamps()
    end

    # 为群聊ID创建索引，快速查询群聊的所有成员
    create index(:group_members, [:group_id], comment: "群聊成员查询索引")

    # 为用户ID创建索引，快速查询用户加入的所有群聊
    create index(:group_members, [:user_id], comment: "用户群聊查询索引")

    # 创建复合唯一索引，防止用户重复加入同一群聊
    create unique_index(:group_members, [:group_id, :user_id],comment: "防止重复加入群聊的唯一索引")

    # 为角色字段创建索引，快速查询特定角色的成员
    create index(:group_members, [:role], comment: "角色查询索引")
  end
end
